#include "imagecoloradjuster.h"

// ImageColorAdjuster::ImageColorAdjuster() {}

// 初始化色温映射表
const ImageColorAdjuster::TempMap ImageColorAdjuster::tempTable[] = {
    {2000, 1.000, 0.320, 0.000},   // 最暖（offset=-50）
    {3000, 1.000, 0.560, 0.150},
    {4000, 1.000, 0.720, 0.390},
    {5000, 1.000, 0.830, 0.600},
    {6000, 1.000, 0.910, 0.790},
    {6500, 1.000, 1.000, 1.000},  // 标准（offset=0）
    {7000, 1.000, 0.960, 0.920},
    {8000, 0.940, 0.960, 1.000},
    {9000, 0.880, 0.920, 1.000},
    {10000, 0.830, 0.890, 1.000},
    {11000, 0.790, 0.860, 1.000},
    {12000, 0.760, 0.840, 1.000}  // 最冷（offset=50）
};


std::tuple<double, double, double> ImageColorAdjuster::calculateTempScales(int targetKelvin)
{
    const int tableSize = sizeof(tempTable) / sizeof(tempTable[0]);

    // 低于最低温度
    if (targetKelvin <= tempTable[0].kelvin) {
        return {tempTable[0].r, tempTable[0].g, tempTable[0].b};
    }
    // 高于最高温度
    if (targetKelvin >= tempTable[tableSize - 1].kelvin) {
        return {tempTable[tableSize - 1].r, tempTable[tableSize - 1].g, tempTable[tableSize - 1].b};
    }
    // 中间温度：线性插值
    for (int i = 0; i < tableSize - 1; ++i) {
        if (targetKelvin >= tempTable[i].kelvin && targetKelvin < tempTable[i + 1].kelvin) {
            const double ratio = static_cast<double>(targetKelvin - tempTable[i].kelvin)
            / (tempTable[i + 1].kelvin - tempTable[i].kelvin);
            return {
                tempTable[i].r + ratio * (tempTable[i + 1].r - tempTable[i].r),
                tempTable[i].g + ratio * (tempTable[i + 1].g - tempTable[i].g),
                tempTable[i].b + ratio * (tempTable[i + 1].b - tempTable[i].b)
            };
        }
    }
    return {1.0, 1.0, 1.0}; // 默认值（理论上不会触发）
}
